package cn.gyn.gynrpc.core.api;

/**
 * 过滤器：前置和后置的一些筛选
 */
public interface Filter {
    /**
     * 前置过滤
     * 返回response是为了给response深加工处理
     * @param request
     * @return
     */
    Object prefilter(RpcRequest request);

    /**
     * 后置过滤
     * @param request
     * @param response
     * @return
     */
    Object postfilter(RpcRequest request, RpcResponse response,Object result);

    //这里还提到了一种filter chain链：组合多种过滤器，指定过滤顺序等，比如：
    //Filter next();
    //或者直接定义个Filter[]数组去挨个调用也可以，Filter[] filter = r -> True;

    // Mock挡板功能
    // A -> B ->C 当一个方法A调了B ，B调了C，如果出了问题，可以通过加挡板D来排查问题出在了哪个环节
    // - -> - ->D 如果挡板放在C这里，不执行C的情况下，如果还有问题，那问题就在A或B上，再往前加挡板
    // - -> D 若把挡板D加B这里，问题不见了，那就说明问题出在B，比如开发种某个环节比较慢还没好，就用mock代替先测其他环节。





    //这里模仿RegistryCenter写一个默认的实现
    Filter Default = new Filter() {
        @Override
        public Object prefilter(RpcRequest request) {
            return null;
        }

        @Override
        public Object postfilter(RpcRequest request, RpcResponse response,Object result) {
            return null;
        }
    };

}
